package leetcode.interviewClassics;

/**
 * @author Cheng Jun
 * Description: 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * <p>
 * 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31− 1] ，就返回 0。
 * <p>
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-integer
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @version 1.0
 * @date 2022/1/8 11:15
 * 经典题 二刷
 */
public class reverse {
    // 思路：相当于对目标数字x 每次缩小10，然后将 结果res 扩大10倍 并加到res上
    // 需要注意的是 在res 扩大10倍的过程中，res可能会超出int 范围，所以在每次扩大10之前，要判断会不会超出int范围
    public int reverse(int x) {
        int res = 0;
        while (x != 0) {
            // 如果在扩大10倍后会溢出，则返回 0 两种溢出情况：正数溢出或负数溢出
            if ( Integer.MAX_VALUE / 10  < res || Integer.MIN_VALUE / 10 > res){
               return 0;
            }
            // 取模，注意负数取模也是负数， -12 % 10 ==》 -2
            int mod = x % 10;
            x /= 10;
            res = res * 10 + mod;
        }
        return res;
    }
}
